package modelo;

import tablero.Square;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import cards.Card;
import cards.Features;
import cards.Monje;


public class Player implements Comparable<Player>{
	public enum Colors{
		ROJO,VERDE,AZUL,
		AMARILLO,BLANCO,NEGRO
	}
	private static int playerNum=0; //variable estatica para ir asignando numeros unicos a cada jugador
	private int number;             //numero del jugador
	private Colors color;
	private String playerName;
	private Square ubication=null;
	private boolean hasMoved=false;
	private boolean votoSilencio=false;
	//private Set<Monje> cartasMonje=null;
	//Modificacion de Cartas de Jugador para recibir todo tipo de carta
	private Set<Card> cartasMonje=null;
	private Set<Sospechoso> hojaSospechosos=null;
	
	
	/**
	 * Constructor for player object.
	 * <p> 
	 * @param  name the player's name
	 * @param  color a color for the player, it's an enum type
	 */
	public Player(String name,Colors color){
		playerName=name;
		this.color=color;
		number=++playerNum;
	}
	
	/**
	 * returns true if the player has moved, else it returns false
	 * <p> 
	 * @return    boolean
	 */
	public boolean hasMoved(){
		return hasMoved;
	}
	
	public boolean votoSilencio(){
		return votoSilencio;
	}
	
	/**
	 * set the hasMoved boolean to false
	 * <p> 
	 * @return    void
	 */
	public void reset(){
		hasMoved=false;
		votoSilencio=false;
	}
	
	/**
	 * 
	 * @param hand
	 * @param features
	 * @return
	 */
	public int answer(int hand,List<Features> features){  // 1 o dos caracteristicas en cartas monje // true si va a la mano false si va ala hoja de sospechosos
		Card pibot = new Monje();
		int cont = 0;
		if(hand==1){
			for(Card monje:cartasMonje){
				if(monje.getClass().equals(pibot.getClass()))
					if(((Monje) monje).is(features))cont++;
			}
		}
		else if(hand==2){
			for(Sospechoso sospechoso:hojaSospechosos){
				if(sospechoso.getMonje().is(features)&& sospechoso.isMarcado()) cont++;
			}
		}
		return cont;
	}
	
	public void setNewCardToPlayersCardDeck(Monje card){
		 cartasMonje.add(card);
	}
	
	public boolean answer(int hand,String nombre){
		boolean check=false;
		Card pibot = new Monje();
		if(hand==1){
			for(Card monje:cartasMonje){
				if(monje.getClass().equals(pibot.getClass()))
				if(nombre.equals(((Monje) monje).getName()))check = true;
			}
		}
		else if(hand==2){
			for(Sospechoso sospechoso:hojaSospechosos){
				if(sospechoso.getMonje().getName().equals(nombre) && sospechoso.isMarcado()) check=true;
			}
		}
		return check;
	}

	public  Monje getMonkCardX(int position) throws NullPointerException{
		int cont = 0;
		Card pibot = new Monje();
		Monje temp=null;
		for (Card n : cartasMonje ){
			if (cont == position)	 
				if(n.getClass().equals(pibot.getClass()))
					temp= (Monje) n;
			cont++;			 
		}
		cartasMonje.remove(temp);

		return temp;
	}
	public void setHojaDeSospechosos(Set<Sospechoso> set){
		if(hojaSospechosos==null) hojaSospechosos= set;

	}

	public Square getUbication() {
		return ubication;
	}

	public void setUbicacion(Square ubicacion) {
		this.ubication = ubicacion;	
	}

	public void move(Square ubication){
		this.ubication = ubication;
		hasMoved=true;
	}

	public void setCartasMonje(Set<Monje> cartasMonjeJugador){
		this.cartasMonje=new TreeSet<Card>(cartasMonjeJugador);
	}
	public Monje getLastMonkCardInPlayersCardDeck(){
		Monje aDevolver=null;
		Card pibot = new Monje();
		for (Card p:cartasMonje) 
			if(p.getClass().equals(pibot.getClass()))
			aDevolver=(Monje) p;
		cartasMonje.remove(aDevolver);
		//if (aDevolver!=null)
		return aDevolver;
	}

	public Set<Card> getCartasMonje(){
		return cartasMonje;
	}

	public Set<Sospechoso> getHojaSospechosos(){
		return hojaSospechosos;
	}
	
	public void marcarSospechosos(){
		for(Sospechoso s:hojaSospechosos){
			Monje m = s.getMonje();
			if(cartasMonje.contains(m)) s.setMarcado();
		}
	}
	
	public void marcarSospechoso(String name){
		for(Sospechoso s:hojaSospechosos){
			Monje m = s.getMonje();
			if(m.getName().equals(name)) s.setMarcado();
		}
	}


	@Override
	public String toString() {
		String casilla;
		if(ubication!=null) casilla = ubication.getSquareName();
		else casilla="no ubicado";
		return "nombre : " + playerName + ", color : " + color
				+ ", numero : " + number +", ubicacion : "+ casilla +"]";
	}

	public int getNumero() {
		return number;
	}

	public Colors getColor() {
		return color;
	}

	public String getNombreJugador() {
		return playerName;
	}

	@Override
	public int compareTo(Player o) {
		// TODO Auto-generated method stub
		return (this.number-o.number);
	}

}
